<?php
/* 
 * Statcic class that works as Factory for every DataBaseObject.
 */
require_once 'SystemObject.php';
require_once 'db.php';

/**
 * Statcic class that works as Factory for every DataBaseObject.
 *
 * @author josema
 */
class DataBaseFactory extends SystemObject{
    protected $database = 'economy';
    protected $table;
    private $link;

    /**
     * Almacena el recurso del ultimo select realizado sobre este objeto
     * @var resource
     */
    private $current_select;

    /**
     * Construye el objeto que se encargará de realizar las conexiones con la
     * base de datos y lo almacena en la propiedad link del modelo.
     * @param DataBaseObject $dbobject
     */
    public function  __construct($dbobject) {
        $this->object_name = get_class($dbobject);
        $this->table = $dbobject->getTable();
        $this->link = new ddbb($this->database, $this->debug);
    }

    /**
     * Realiza un select sobre este objeto en base de datos.
     * El recurso lo almacena en la propiedad current_select.
     * @return boolean
     */
    public function selectAllObjects(){
        $this->link->connect();
        $this->current_select = $this->link->select($this->table);

        return $this->current_select != false;
    }

    /**
     * Realiza un select sobre este objeto en base de datos con ciertas condiciones.
     * @param string $table  tabla/s de la cual se hace la seleccion
     * @param array $fields  campos que selecciona de la/s tabla/s, por defecto todos
     * @param string $condicion condicion a cumplir los campos para ser selccionados, por defecto ninguna
     * @param array $limit   limites de seleccion, cuantos campos queremos que nos devuelva la consulta, por defecto todas
     * @return boolean
     */
    public function selectWhere($fields = array("*"), $condition = FALSE, $limit = FALSE, $order = FALSE){
        $this->link->connect();
        $this->current_select = $this->link->select($this->table, $fields, $condition, $limit, $order);

        return $this->current_select != false;
    }

    /**
     * Devuelve un array con todos los objetos de la base de datos
     * @return array(DataBaseObject)
     */
    public function getAllObjects(){
        // Realizamos la consulta de todos los objetos en base de datos
        if($this->selectAllObjects()){

            // Cogemos el nombre de la clase
            $class_name = get_class($this);
            $return = array();
            // Uno por uno los construimos y devolvemos un array con todos los objetos
            while ($row = $this->link->fetch($this->current_select)) {
                $return[] = new $this->object_name($row);
            }

        print_r($return);
        }
        return $return;
    }

    public function getWhere ($fields = array("*"), $condition = FALSE, $limit = FALSE, $order = FALSE) {
        if ($this->selectWhere ($fields, $condition, $limit, $order)) {

            // Cogemos el nombre de la clase
            $class_name = get_class($this);
            $return = array();
            // Uno por uno los construimos y devolvemos un array con todos los objetos
            while ($row = $this->link->fetch($this->current_select)) {
                $return[] = new $this->object_name($row);
            }
        }

        return $return;
    }

    /**
     * Realiza un fetch sobre el recurso activo en la clase.
     * @return DataBaseObject/false
     */
    public function fetch(){
       if($this->current_select){
            $row = $this->link->fetch($this->current_select);
            if ($row)
                return new $this->object_name($row);
            else return false;
       }
       return false;
    }
}
?>
